A variety of techniques exists for sharing files, printers, and other resources between two computers on a network. For example, one application-layer network protocol for sharing resources is Server Message Block (SMB). SMB is used by MICROSOFT™ WINDOWS™ and other operating systems to allow two computers or other resources to communicate, request access to resources, specify intended access of resources (e.g., reading, writing, etc.), lock resources, and so on. MICROSOFT™ WINDOWS™ Vista introduced SMB 2.0, which simplified the command set of SMB 1.0 and added many other enhancements. MICROSOFT™ WINDOWS™ 7 and Server 2008 R2 introduced SMB 2.1, which added opportunistic locking (oplocks) and other enhancements.
Most protocols for remote sharing of resources assume a one-to-one relationship between connections and sessions. A session represents the lifetime of any single request to access a resource and the subsequent access of that resource until the connection is terminated. A session may also be associated with a particular security principal and validated security credentials that determine the actions that are authorized during the session. A connection can include a Transmission Control Protocol (TCP) or other type of connection over which higher-level protocols like SMB can communicate to carry out commands. An SMB session typically involves opening a TCP connection between a source of a request and a target of the request, sending one or more SMB commands to access the target resource, and then closing the session.
Many computers today are connected in such a way that there are multiple available connections between the computers. For example, datacenter servers are often built with two or more Network Interface Cards (NICs) so that if one fails network traffic can be sent over the other one. Client computers may include a wireless network connection (Wi-Fi), a Bluetooth connection, a wired Ethernet (e.g., Local Area Network (LAN)) connection, and so forth. Server computers may include a storage area network (SAN), connections via Fibre Channel, wired Ethernet, and so forth. Some or all of these connections may provide connectivity to some or all of the same resources.
Unfortunately, the available connection information is generally unavailable to an application or application layer protocols that use the network. An application that requests a connection to a server will typically hand all responsibility for choosing the device/protocol over which to make the connection to a lower-level network layer, and the network layer will make a single connection to carry out the application's commands. If the connection fails, the application or network layer may try another connection by setting up the session again or may involve manual intervention to do so. Use of a single connection leads to a fragile connection that is terminated if the connection fails for any reason, and is unable to leverage the aggregate bandwidth provided by multiple networks. Some protocols, like the Network File System (NFS) include parallelization extensions (e.g., pNFS) that allow for use of redundant paths to data to improve throughput, but these do not provide any information to higher levels that can be used to manage the connection. Another example is the experimental Multipath TCP (MPTCP) protocol that has a specific goal of remaining undetected to higher layers for backwards compatibility. The function of these protocols is completely out of the control of higher layers, and the network layer may not automatically select the fastest connection on its own or provide the most efficient use of connections for failover, throughput, or other purposes.